package com.bird.thread.javamemorymodel;


import java.util.concurrent.CountDownLatch;

/**
 * @author: bird
 * @Data: 2021/7/6 15:42
 * @description: 验证：重排序
 */
public class ReOrdered {


    ///定义两个静态变量 static-修饰的变量一般保存在方法区
    private    static int a, b = 0;
    private static int x, y = 0;

    public static void main(String[] args) throws InterruptedException {

        int count = 0;

        for (; ; ) {
            count++;
            a = 0;
            b = 0;
            x = 0;
            y = 0;

            // 计时等待
            CountDownLatch latch = new CountDownLatch(1);

            //线程1
            Thread one = new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        //让当前的线程走到这里就等待
                        //  latch.countDown();
                        latch.await();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    a = 1;
                    x = b;
                }
            });

/*
* a=1;
* x=b;
* b=1;
* y=a;
* +++++
*  x=b;
*  a=1;
*  y=a;
*  b=1;
*
* */
            // 线程2
            Thread two = new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        // 让当前的线程走到这里就等待
                        //   latch.countDown();
                        latch.await();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    b = 1;
                    y = a;
                }
            });

            two.start();
            one.start();
            //计时时间到 就让所有的等待的线程唤醒
            latch.countDown();
            // 让主线程等待子线程执行完之后再执行
            one.join();
            two.join();

            String result = "第" + count + "次" + "x= " + x + "," + " y= " + y;

            if (x == 0 && y == 0) {
                //发生了重排序：第828388次+x= 0, y= 0
                System.out.println("发生了重排序：" + result);
                break;
            } else {
                System.out.println(result);
            }

        }


    }
    /*运行结果：
     * 第一种情况：线程1先执行,线程2再执行 最终的结果：  x=0,y=1
     * 第二种情况：线程2先执行，线程1再执行 最终的结果： x=1,y=0
     * 第三种情况：线程1执行一半，然后cpu调度切换到线程2执行 导致的最终的结果 x=1,y=1;
     * 第四种情况：  x=0;y=0; 导致这种情况的原因是发生了重排序。
     */

}
